
-- 
-- Migracion de valores unicos por empresa
-- 
/*
 ATENCION IMPLEMENTADORES 

 Se implementa con esto el control de unicidad de valores POR EMPRESA. Si esta leyendo esto es porque la migracion ha fallado
 No es necesario que funcione, si anda se podrá controlar por empresa, si no anda el sistema funcionará como hasta ahora.
  
 Si este script fallo, el problema es que alguna sucursal es visible por más de una empresa. 
 
 Si es asi, el sistema no podra controlar unicidad por empresa. (un cheque con el mismo numero ingresando a dos empresas del mismo sistema)
 
 Que una sucursal pertenezca a dos empresas puede ocurrir porque si o porque se definio una empresa ficticia para algun fin y 
 esta empresa ve sucursales que son de otras reales. 

 Si este fuera el caso, hay que volver a entrar al sistema - SE PODRA ENTRAR POR SER SUBVERSION, HAY CANCELAR LA MIGRACION PROPUESTA Y ENTRAR IGUAL - , ir a la actualizacion de empresas y en esta empresa ficticia y poner la palabra <GRUPO> (con los corchetes quebrados) en su campo observaciones, salir del sistema, entrar de nuevo y terminar de migrar.
 
 Si es otro caso donde las sucursales estan mezcladas porque si pero no hay una idea de GRUPO, no se podrá controlar y por lo tanto 
 hay que ejecutar este script borrando la ejecución de la funcion de migracion (abajo) y borrando el query de control (el resto dejarlo).
 
 Es decir la funcion se CREARA pero no se va a ejecutar.
 
*/

-- QUERY DE CONTROL : query que falla si no se puede continuar (borrarlo o no segun lo que dice arriba)
update ambcfg 
set version = coalesce(cast(
	(SELECT CODAMBSUC FROM ambempsuc
	 WHERE codambsuc = (SELECT codambsuc
	  			FROM ambempsuc
	  			INNER JOIN ambemp ON ambemp.cod = ambempsuc.codambemp
	  			WHERE position('<GRUPO>' in UPPER(coalesce(ambemp.observaciones,''))) = 0
	  			GROUP BY codambsuc
	  			HAVING COUNT(*) > 1)
	) as varchar),'517.02');
-- Fin del QUERY DE CONTROL




CREATE OR REPLACE FUNCTION abaco_utiles.migracion_val(
	)
    RETURNS boolean
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$
DECLARE
  vMensaje varchar;
BEGIN


   
   IF NOT EXISTS (SELECT count(codambemp) 
			  FROM ambempsuc
			  INNER JOIN ambemp ON ambemp.cod = ambempsuc.codambemp
			  WHERE position('<GRUPO>' in UPPER(coalesce(ambemp.observaciones,''))) = 0
			  GROUP BY codambsuc
			  HAVING COUNT(*) > 1)
   THEN 
     	UPDATE VAL
		SET codambemp = valores.codambemp
		FROM 
		(SELECT VAL.ID, MAX(ambemp.cod) as codambemp
		FROM VAL
		INNER JOIN VALT ON VAL.TIPOVALT = VALT.TIPO
		INNER JOIN CTEM ON CTEM.IDVAL = VAL.ID
		INNER JOIN COMM ON CTEM.IDCOMM = COMM.ID
		INNER JOIN VVAL_M ON VVAL_M.PRIMERIDCTEM = CTEM.ID
		INNER JOIN AMBEMPSUC ON AMBEMPSUC.CODAMBSUC = COMM.CODAMBSUC
		INNER JOIN AMBEMP ON AMBEMP.COD = AMBEMPSUC.CODAMBEMP AND POSITION('<GRUPO>' IN UPPER(COALESCE(AMBEMP.OBSERVACIONES,''))) = 0
		WHERE CTEM.IDVAL IS NOT NULL AND VALT.CV <> 'P'
		GROUP BY VAL.ID) AS VALORES
		WHERE VAL.ID = VALORES.ID;
   ELSE
      vMensaje := 'No voy a migrar valores porque la definicion de las empresas-sucursales indica que alguna sucursal pertenece a mas de una empresa.' ||
	                         ' Si hay empresas ficticias, ingrese nuevamente al sistema - que lo dejará por ser una subversion - e indique en sus observaciones que es tipo <GRUPO>';
      RAISE EXCEPTION '%',vMensaje;
   END IF;
  
  RETURN TRUE;

END;
$BODY$;

ALTER FUNCTION abaco_utiles.migracion_val()
    OWNER TO abacouser;

-- EJECUCION DE FUNCION DE MIGRACION 	
	
SELECT abaco_utiles.migracion_val();

--

--
SELECT aaVersion('517.03','517.02');
--	
	
	


